/*
 *  This file is part of the SIRIUS libraries for analyzing MS and MS/MS data
 *
 *  Copyright (C) 2024 Bright Giant GmbH
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along with SIRIUS.  If not, see <http://www.gnu.org/licenses/>.
 *
 *  NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 *  https://openapi-generator.tech
 *  Do not edit the class manually.
 */


package io.sirius.ms.sdk.model;

import java.util.Objects;
import java.util.Arrays;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.annotation.JsonValue;
import io.sirius.ms.sdk.model.ZodiacAnalogueNodes;
import io.sirius.ms.sdk.model.ZodiacEdgeFilterThresholds;
import io.sirius.ms.sdk.model.ZodiacEpochs;
import io.sirius.ms.sdk.model.ZodiacLibraryScoring;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.annotation.JsonTypeName;

/**
 * User/developer friendly parameter subset for the ZODIAC tool (Network base molecular formula re-ranking).  Needs results from Formula/SIRIUS Tool
 */
@JsonPropertyOrder({
  Zodiac.JSON_PROPERTY_ENABLED,
  Zodiac.JSON_PROPERTY_CONSIDERED_CANDIDATES_AT300_MZ,
  Zodiac.JSON_PROPERTY_CONSIDERED_CANDIDATES_AT800_MZ,
  Zodiac.JSON_PROPERTY_RUN_IN_TWO_STEPS,
  Zodiac.JSON_PROPERTY_EDGE_FILTER_THRESHOLDS,
  Zodiac.JSON_PROPERTY_GIBBS_SAMPLER_PARAMETERS,
  Zodiac.JSON_PROPERTY_LIBRARY_SEARCH_ANCHORS,
  Zodiac.JSON_PROPERTY_ANALOGUE_SEARCH_ANCHORS
})
@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.14.0")
public class Zodiac {
  public static final String JSON_PROPERTY_ENABLED = "enabled";
  @jakarta.annotation.Nullable
  private Boolean enabled;

  public static final String JSON_PROPERTY_CONSIDERED_CANDIDATES_AT300_MZ = "consideredCandidatesAt300Mz";
  @jakarta.annotation.Nullable
  private Integer consideredCandidatesAt300Mz;

  public static final String JSON_PROPERTY_CONSIDERED_CANDIDATES_AT800_MZ = "consideredCandidatesAt800Mz";
  @jakarta.annotation.Nullable
  private Integer consideredCandidatesAt800Mz;

  public static final String JSON_PROPERTY_RUN_IN_TWO_STEPS = "runInTwoSteps";
  @jakarta.annotation.Nullable
  private Boolean runInTwoSteps;

  public static final String JSON_PROPERTY_EDGE_FILTER_THRESHOLDS = "edgeFilterThresholds";
  @jakarta.annotation.Nullable
  private ZodiacEdgeFilterThresholds edgeFilterThresholds;

  public static final String JSON_PROPERTY_GIBBS_SAMPLER_PARAMETERS = "gibbsSamplerParameters";
  @jakarta.annotation.Nullable
  private ZodiacEpochs gibbsSamplerParameters;

  public static final String JSON_PROPERTY_LIBRARY_SEARCH_ANCHORS = "librarySearchAnchors";
  @jakarta.annotation.Nullable
  private ZodiacLibraryScoring librarySearchAnchors;

  public static final String JSON_PROPERTY_ANALOGUE_SEARCH_ANCHORS = "analogueSearchAnchors";
  @jakarta.annotation.Nullable
  private ZodiacAnalogueNodes analogueSearchAnchors;

  public Zodiac() {
  }

  public Zodiac enabled(@jakarta.annotation.Nullable Boolean enabled) {
    
    this.enabled = enabled;
    return this;
  }

  /**
   * tags whether the tool is enabled
   * @return enabled
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_ENABLED)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public Boolean isEnabled() {
    return enabled;
  }


  @JsonProperty(JSON_PROPERTY_ENABLED)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setEnabled(@jakarta.annotation.Nullable Boolean enabled) {
    this.enabled = enabled;
  }

  public Zodiac consideredCandidatesAt300Mz(@jakarta.annotation.Nullable Integer consideredCandidatesAt300Mz) {
    
    this.consideredCandidatesAt300Mz = consideredCandidatesAt300Mz;
    return this;
  }

  /**
   * Maximum number of candidate molecular formulas (fragmentation trees computed by SIRIUS) per compound which are considered by ZODIAC for compounds below 300 m/z.
   * @return consideredCandidatesAt300Mz
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_CONSIDERED_CANDIDATES_AT300_MZ)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public Integer getConsideredCandidatesAt300Mz() {
    return consideredCandidatesAt300Mz;
  }


  @JsonProperty(JSON_PROPERTY_CONSIDERED_CANDIDATES_AT300_MZ)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setConsideredCandidatesAt300Mz(@jakarta.annotation.Nullable Integer consideredCandidatesAt300Mz) {
    this.consideredCandidatesAt300Mz = consideredCandidatesAt300Mz;
  }

  public Zodiac consideredCandidatesAt800Mz(@jakarta.annotation.Nullable Integer consideredCandidatesAt800Mz) {
    
    this.consideredCandidatesAt800Mz = consideredCandidatesAt800Mz;
    return this;
  }

  /**
   * Maximum number of candidate molecular formulas (fragmentation trees computed by SIRIUS) per compound which are considered by ZODIAC for compounds above 800 m/z.
   * @return consideredCandidatesAt800Mz
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_CONSIDERED_CANDIDATES_AT800_MZ)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public Integer getConsideredCandidatesAt800Mz() {
    return consideredCandidatesAt800Mz;
  }


  @JsonProperty(JSON_PROPERTY_CONSIDERED_CANDIDATES_AT800_MZ)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setConsideredCandidatesAt800Mz(@jakarta.annotation.Nullable Integer consideredCandidatesAt800Mz) {
    this.consideredCandidatesAt800Mz = consideredCandidatesAt800Mz;
  }

  public Zodiac runInTwoSteps(@jakarta.annotation.Nullable Boolean runInTwoSteps) {
    
    this.runInTwoSteps = runInTwoSteps;
    return this;
  }

  /**
   * As default ZODIAC runs a 2-step approach. First running &#39;good quality compounds&#39; only, and afterwards including the remaining.
   * @return runInTwoSteps
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_RUN_IN_TWO_STEPS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public Boolean isRunInTwoSteps() {
    return runInTwoSteps;
  }


  @JsonProperty(JSON_PROPERTY_RUN_IN_TWO_STEPS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setRunInTwoSteps(@jakarta.annotation.Nullable Boolean runInTwoSteps) {
    this.runInTwoSteps = runInTwoSteps;
  }

  public Zodiac edgeFilterThresholds(@jakarta.annotation.Nullable ZodiacEdgeFilterThresholds edgeFilterThresholds) {
    
    this.edgeFilterThresholds = edgeFilterThresholds;
    return this;
  }

  /**
   * Get edgeFilterThresholds
   * @return edgeFilterThresholds
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_EDGE_FILTER_THRESHOLDS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public ZodiacEdgeFilterThresholds getEdgeFilterThresholds() {
    return edgeFilterThresholds;
  }


  @JsonProperty(JSON_PROPERTY_EDGE_FILTER_THRESHOLDS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setEdgeFilterThresholds(@jakarta.annotation.Nullable ZodiacEdgeFilterThresholds edgeFilterThresholds) {
    this.edgeFilterThresholds = edgeFilterThresholds;
  }

  public Zodiac gibbsSamplerParameters(@jakarta.annotation.Nullable ZodiacEpochs gibbsSamplerParameters) {
    
    this.gibbsSamplerParameters = gibbsSamplerParameters;
    return this;
  }

  /**
   * Get gibbsSamplerParameters
   * @return gibbsSamplerParameters
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_GIBBS_SAMPLER_PARAMETERS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public ZodiacEpochs getGibbsSamplerParameters() {
    return gibbsSamplerParameters;
  }


  @JsonProperty(JSON_PROPERTY_GIBBS_SAMPLER_PARAMETERS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setGibbsSamplerParameters(@jakarta.annotation.Nullable ZodiacEpochs gibbsSamplerParameters) {
    this.gibbsSamplerParameters = gibbsSamplerParameters;
  }

  public Zodiac librarySearchAnchors(@jakarta.annotation.Nullable ZodiacLibraryScoring librarySearchAnchors) {
    
    this.librarySearchAnchors = librarySearchAnchors;
    return this;
  }

  /**
   * Get librarySearchAnchors
   * @return librarySearchAnchors
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_LIBRARY_SEARCH_ANCHORS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public ZodiacLibraryScoring getLibrarySearchAnchors() {
    return librarySearchAnchors;
  }


  @JsonProperty(JSON_PROPERTY_LIBRARY_SEARCH_ANCHORS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setLibrarySearchAnchors(@jakarta.annotation.Nullable ZodiacLibraryScoring librarySearchAnchors) {
    this.librarySearchAnchors = librarySearchAnchors;
  }

  public Zodiac analogueSearchAnchors(@jakarta.annotation.Nullable ZodiacAnalogueNodes analogueSearchAnchors) {
    
    this.analogueSearchAnchors = analogueSearchAnchors;
    return this;
  }

  /**
   * Get analogueSearchAnchors
   * @return analogueSearchAnchors
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_ANALOGUE_SEARCH_ANCHORS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public ZodiacAnalogueNodes getAnalogueSearchAnchors() {
    return analogueSearchAnchors;
  }


  @JsonProperty(JSON_PROPERTY_ANALOGUE_SEARCH_ANCHORS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setAnalogueSearchAnchors(@jakarta.annotation.Nullable ZodiacAnalogueNodes analogueSearchAnchors) {
    this.analogueSearchAnchors = analogueSearchAnchors;
  }


  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    Zodiac zodiac = (Zodiac) o;
    return Objects.equals(this.enabled, zodiac.enabled) &&
        Objects.equals(this.consideredCandidatesAt300Mz, zodiac.consideredCandidatesAt300Mz) &&
        Objects.equals(this.consideredCandidatesAt800Mz, zodiac.consideredCandidatesAt800Mz) &&
        Objects.equals(this.runInTwoSteps, zodiac.runInTwoSteps) &&
        Objects.equals(this.edgeFilterThresholds, zodiac.edgeFilterThresholds) &&
        Objects.equals(this.gibbsSamplerParameters, zodiac.gibbsSamplerParameters) &&
        Objects.equals(this.librarySearchAnchors, zodiac.librarySearchAnchors) &&
        Objects.equals(this.analogueSearchAnchors, zodiac.analogueSearchAnchors);
  }

  @Override
  public int hashCode() {
    return Objects.hash(enabled, consideredCandidatesAt300Mz, consideredCandidatesAt800Mz, runInTwoSteps, edgeFilterThresholds, gibbsSamplerParameters, librarySearchAnchors, analogueSearchAnchors);
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class Zodiac {\n");
    sb.append("    enabled: ").append(toIndentedString(enabled)).append("\n");
    sb.append("    consideredCandidatesAt300Mz: ").append(toIndentedString(consideredCandidatesAt300Mz)).append("\n");
    sb.append("    consideredCandidatesAt800Mz: ").append(toIndentedString(consideredCandidatesAt800Mz)).append("\n");
    sb.append("    runInTwoSteps: ").append(toIndentedString(runInTwoSteps)).append("\n");
    sb.append("    edgeFilterThresholds: ").append(toIndentedString(edgeFilterThresholds)).append("\n");
    sb.append("    gibbsSamplerParameters: ").append(toIndentedString(gibbsSamplerParameters)).append("\n");
    sb.append("    librarySearchAnchors: ").append(toIndentedString(librarySearchAnchors)).append("\n");
    sb.append("    analogueSearchAnchors: ").append(toIndentedString(analogueSearchAnchors)).append("\n");
    sb.append("}");
    return sb.toString();
  }

  /**
   * Convert the given object to string with each line indented by 4 spaces
   * (except the first line).
   */
  private String toIndentedString(Object o) {
    if (o == null) {
      return "null";
    }
    return o.toString().replace("\n", "\n    ");
  }

}

